package com.lottery.ruok.lottrey.chat;

import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.lottery.ruok.lottrey.MyApplication;
import com.lottery.ruok.lottrey.chat.event.manager.ConversationEventManager;

import com.lottery.ruok.lottrey.chat.model.extension.SampleExtensionModule;
import com.lottery.ruok.lottrey.chat.model.prize.message.PrizeMessage;
import com.lottery.ruok.lottrey.chat.model.prize.message.PrizeMessageItemProvider;
import com.lottery.ruok.lottrey.chat.model.redpacket.message.receiveRedPacketMessage.ReceiveRedPacketMessage;
import com.lottery.ruok.lottrey.chat.model.redpacket.message.receiveRedPacketMessage.ReceiveRedPacketMessageItemProvider;
import com.lottery.ruok.lottrey.chat.model.redpacket.message.sendRedPacketMessage.RedPacketMessage;
import com.lottery.ruok.lottrey.chat.model.redpacket.message.sendRedPacketMessage.RedPacketMessageItemProvider;
import com.lottery.ruok.lottrey.chat.model.system.SystemMessage;
import com.lottery.ruok.lottrey.chat.model.text.AppTextMessageItemProvider;
import com.lottery.ruok.lottrey.retrofitModule.BaseModel;
import com.lottery.ruok.lottrey.retrofitModule.RetrofitBase;
import com.lottery.ruok.lottrey.retrofitModule.RxHelper;
import com.lottery.ruok.lottrey.retrofitModule.RxSubscribe;
import com.lottery.ruok.lottrey.retrofitModule.request.GetRongTokenRequest;
import com.lottery.ruok.lottrey.retrofitModule.response.GetRongTokenResponse;
import com.lottery.ruok.lottrey.userInfo.UserInfo;

import java.util.List;

import io.reactivex.Observable;
import io.rong.imkit.DefaultExtensionModule;
import io.rong.imkit.IExtensionModule;
import io.rong.imkit.RongExtensionManager;
import io.rong.imkit.RongIM;
import io.rong.imlib.IRongCallback;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.imlib.model.MessageContent;
import utils.StringUtils;

/**
 * 融云管理者
 */
public class RongCloudChatManager {

    private static Application context;
    private static String currentRoomId;

    public static void init(Application application) {
        context = application;
        /**
         * 初始化
         */
        initRongCloud();

        /**
         * 注册扩展模块
         */
        registerExtensionModules();
        /**
         * 注册事件监听
         */
        registerEventListener();

        /**
         * 链接
         * 暂不登陆，尽量不在application里面执行耗时操作
         */
      //  connect();

    }

    /**
     * 初始化融云
     */
    private static void initRongCloud() {
        if (context.getApplicationInfo().packageName.equals(getCurProcessName(context))) {
           /* if (context.getPackageName().equals("com.lottery.ruok.lottrey")){
                RongIM.init(context, "25wehl3u2sa7w");
            }else if (context.getPackageName().equals("com.lottery.ruok.yunding")){
                RongIM.init(context, "25wehl3u2sa7w");
            }else if (context.getPackageName().equals("com.lottery.ruok.xintiandi")){
                RongIM.init(context, "25wehl3u2sa7w");
            }else if (context.getPackageName().equals("com.lottery.ruok.dongfang")){
                RongIM.init(context, "25wehl3u2sa7w");
            }else if (context.getPackageName().equals("com.lottery.ruok.yazhoucb")){
                RongIM.init(context, "25wehl3u2sa7w");
            }*/
            RongIM.init(context, "25wehl3u2sa7w");

        }
    }

    /**
     * 链接
     */
    public static void connect() {
        if (StringUtils.isEmpty(UserInfo.getRongCloudToken())) {
            getRongCloudToken();
        } else {
            connectRongCloud(UserInfo.getRongCloudToken());
        }
    }

    /**
     * 从服务器获取融云token
     */
    private static void getRongCloudToken() {

//        if (context.getApplicationInfo().packageName.equals(getCurProcessName(context))) {
        Observable<BaseModel<GetRongTokenResponse>> observable;
        if (TextUtils.isEmpty(UserInfo.getToken())) {
            observable = RetrofitBase.getRetrofit().create(GetRongTokenRequest.class).getResultByUuid(MyApplication.UUID);
        } else {
            observable =
                    RetrofitBase.getRetrofit().create(GetRongTokenRequest.class).getResult(UserInfo.getToken());
        }
        observable
                .compose(RxHelper.<GetRongTokenResponse>handleResultReConnection())
                .subscribe(new RxSubscribe<GetRongTokenResponse>(context) {
                    @Override
                    protected void _onNext(GetRongTokenResponse data) {
                        if (data != null) {
                            UserInfo.setRongCloudToken(data.getToken());
                            connectRongCloud(UserInfo.getRongCloudToken());
                        }

                    }

                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }

                    @Override
                    protected boolean showDialog() {
                        return false;
                    }
                });
//        }
    }

    /**
     * 注册事件监听
     */
    private static void registerEventListener() {
        ConversationEventManager.init();
    }

    /**
     * 注册扩展模块
     */
    private static void registerExtensionModules() {
        /**
         * 自定义消息系统消息的注册
         */
        RongIM.registerMessageType(SystemMessage.class);
        //RongIM.registerMessageTemplate(new SystemMessageItemProvider());
        /*
         * 红包消息
         * */
        RongIM.registerMessageType(RedPacketMessage.class); //注册红包消息
        RongIM.registerMessageTemplate(new RedPacketMessageItemProvider());
        /*
         *谁抢了谁的红包
         * */
        RongIM.registerMessageType(ReceiveRedPacketMessage.class);
        RongIM.registerMessageTemplate(new ReceiveRedPacketMessageItemProvider());
        /*
         * 打赏自定义
         * */
        RongIM.registerMessageType(PrizeMessage.class); //注册红包消息
        RongIM.registerMessageTemplate(new PrizeMessageItemProvider());
        setMyExtensionModule();

        //文字重写加密
        RongIM.getInstance().registerMessageTemplate(new AppTextMessageItemProvider());

    }
    public static void setMyExtensionModule() {
        List<IExtensionModule> moduleList = RongExtensionManager.getInstance().getExtensionModules();
        IExtensionModule defaultModule = null;
        if (moduleList != null) {
            for (IExtensionModule module : moduleList) {
                if (module instanceof DefaultExtensionModule) {
                    defaultModule = module;
                    break;
                }
            }
            if (defaultModule != null) {
                RongExtensionManager.getInstance().unregisterExtensionModule(defaultModule);
                RongExtensionManager.getInstance().registerExtensionModule(new SampleExtensionModule());
            }
        }
    }
    /**
     * 链接融云
     *
     * @param token
     */
    private static void connectRongCloud(String token) {
        if (StringUtils.isEmpty(token)) {
            return;
        }
        RongIM.connect(token, new RongIMClient.ConnectCallback() {

            /**
             * Token 错误。可以从下面两点检查 1.  Token 是否过期，如果过期您需要向 App Server 重新请求一个新的 Token
             *                  2.  token 对应的 appKey 和工程里设置的 appKey 是否一致
             */
            @Override
            public void onTokenIncorrect() {
                UserInfo.setRongCloudToken("");
                Toast.makeText(context,"聊天初始化失败",Toast.LENGTH_SHORT).show();
            }

            /**
             * 连接融云成功
             * @param userid 当前 token 对应的用户 id
             */
            @Override
            public void onSuccess(String userid) {
                Log.d("LoginActivity", "--onSuccess" + userid);
                setRongCloudCurrentUser(userid);
                UserInfo.setMyUserId(userid);
            }

            /**
             * 连接融云失败
             * @param errorCode 错误码，可到官网 查看错误码对应的注释
             */
            @Override
            public void onError(RongIMClient.ErrorCode errorCode) {
                Log.d("LoginActivity", "--onError" + errorCode.getMessage());

            }
        });
    }

    /**
     * 设置当期用户
     *
     * @param userid
     */
    private static void setRongCloudCurrentUser(String userid) {
        /**
         * 设置当前用户信息，
         * @param userInfo 当前用户信息
         */
        if (com.lottery.ruok.lottrey.utils.StringUtils.isNotEmpty(UserInfo.getToken())) {
            RongIM.getInstance().setCurrentUserInfo(new io.rong.imlib.model.UserInfo(userid, UserInfo.getNickname(), Uri.parse(UserInfo.getAvatar())));
        }else {
            String youName="游客";
            if (userid.length()>5){
                String shortName=userid.substring(userid.length()-5,userid.length());
                youName=youName+shortName;
            }else {
            youName  =youName+userid;
            }


            RongIM.getInstance().setCurrentUserInfo(new io.rong.imlib.model.UserInfo(userid, youName, Uri.parse("")));
        }
        /**
         * 设置消息体内是否携带用户信息。
         * @param state 是否携带用户信息，true 携带，false 不携带。
         */
        RongIM.getInstance().setMessageAttachedUserInfo(true);
    }

    /**
     * <p>断开与融云服务器的连接。当调用此接口断开连接后，仍然可以接收 Push 消息。</p>
     * <p>若想断开连接后不接受 Push 消息，可以调用{@link #logout()}</p>
     */
    public static void disconnect() {
        RongIM.getInstance().disconnect();
    }

    /**
     * 重连需要重新获取Token,并连接融云
     */
    public static void reconnect() {
        getRongCloudToken();
    }


    /**
     * <p>断开与融云服务器的连接，并且不再接收 Push 消息。</p>
     * <p>若想断开连接后仍然接受 Push 消息，可以调用 {@link #disconnect()}</p>
     */
    public static void logout() {
        RongIM.getInstance().logout();
    }


    public static String getCurProcessName(Context context) {
        int pid = android.os.Process.myPid();
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
            if (appProcess.pid == pid) {
                return appProcess.processName;
            }
        }
        return null;
    }


    /**
     * 向当前聊天室发送消息。
     * </p>
     * <strong>注意：</strong>此函数为异步函数，发送结果将通过handler事件返回。
     *
     * @param msgContent 消息对象
     */
    public static void sendMessage(String targetId, final MessageContent msgContent) {
        Message msg = Message.obtain(targetId, Conversation.ConversationType.CHATROOM, msgContent);

        RongIM.getInstance().sendMessage(msg, null, null, new IRongCallback.ISendMessageCallback() {
            @Override
            public void onAttached(Message message) {

            }

            @Override
            public void onSuccess(Message message) {

            }

            @Override
            public void onError(Message message, RongIMClient.ErrorCode errorCode) {


            }
        });
    }
    public static void sendMessagePrivate(String targetId, final MessageContent msgContent) {
        Message msg = Message.obtain(targetId, Conversation.ConversationType.PRIVATE, msgContent);

        RongIM.getInstance().sendMessage(msg, null, null, new IRongCallback.ISendMessageCallback() {
            @Override
            public void onAttached(Message message) {

            }

            @Override
            public void onSuccess(Message message) {

            }

            @Override
            public void onError(Message message, RongIMClient.ErrorCode errorCode) {


            }
        });
    }

    /**
     * 加入聊天室。如果聊天室不存在，sdk 会创建聊天室并加入，如果已存在，则直接加入。加入聊天室时，可以选择拉取聊天室消息数目。
     *
     * @param roomId          聊天室 Id
     * @param defMessageCount 默认开始时拉取的历史记录条数
     * @param callback        状态回调
     */
    public static void joinChatRoom(String roomId, int defMessageCount, final RongIMClient.OperationCallback callback) {
        currentRoomId = roomId;
        RongIMClient.getInstance().joinChatRoom(currentRoomId, defMessageCount, callback);
    }

    /**
     * 退出聊天室，不在接收其消息。
     */
    public static void quitChatRoom(final RongIMClient.OperationCallback callback) {
        RongIMClient.getInstance().quitChatRoom(currentRoomId, callback);
    }

}
